package com.cskaoyan.javase.oop3._2inner._4local._3notice;

/**
 * 局部内部类的注意事项/使用特点:
 *      首先,匿名内部和Lambda表达式也是特殊的局部内部类,它们也具有这个特点
 *
 * 如果是作用域内部的一个局部变量,在局部内部类的方法中被使用了,那么这个局部变量就会成为一个常量,成为一个局部常量.会隐式的被final修饰
 *
 * 那么原因是什么呢?为什么这样呢?
 * 根本原因是因为对象和局部变量的生命周期是有冲突的.
 *
 * 为了解决生命周期的冲突,JVM会在创建"访问了局部变量"的局部内部类对象时,把该"局部变量"作为对象的成员变量塞入对象中
 * 这样解决了生命周期的冲突
 * 但是同时又引入了同步取值的问题,为了避免同步取值,干脆就让该局部变量被修改,成为一个局部常量.
 *
 * 注:
 *      在Java7之前,如果在局部内部类中访问局部变量,那么这个变量必须显式用final修饰
 *      但是在Java8以后,不需要这么做了,而是编译器在底层自动加"final"
 *      这是一种语法糖
 *
 *
 *
 * @since 15:39
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}

class EnclosedClazz {
    public void test() {
        int a = 10;
        // 定义局部内部类
        class Inner {
            public void testInner() {
                System.out.println(a);
                // Variable 'a' is accessed from within inner class, needs to be final or effectively final
                // 在局部内部类中访问作用域中的局部变量,
                // 那么这个局部变量要么直接声明为final,要么就必须不能更改.
                // a++;
            }
        }
    }
}